/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Ventas.DAO;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pe.edu.pucp.Modelo.Cliente;
import pe.edu.pucp.Modelo.EstadoCliente;
import pe.edu.pucp.Modelo.TipoCliente;
import pe.edu.pucp.Modelo.TipoCorreo;
import pe.edu.pucp.Modelo.TipoDocumento;
import pe.edu.pucp.Util.HibernateUtil;

/**
 *
 * @author katy
 */
public class ClientesDAO {
    
    public void guardarCliente(Cliente c) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  null;
        try {
            tx = session.beginTransaction();
            if (c.getIdcliente() == 0)
                session.save(c);
            else 
                session.update(c);
            tx.commit();
        } catch(Exception e) {
            if (tx != null) {
//                tx.rollback();
                throw e;
            }
        } finally {
            session.close();
        }
    }
    
    public ArrayList<Cliente> listarClientes(String nombre, TipoDocumento documento, Long numeroDoc, boolean includeFilters) {
        ArrayList<Cliente> lstClientes = new ArrayList<>();

        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null; 
        try {
            tx = session.beginTransaction();

            //Preparar string query
            String query = "select cliente from Cliente cliente where "
                    + "upper(cliente.estadoCliente.descripcion) = 'ACTIVO' ";

            if (includeFilters && nombre != null && nombre.length()>0)
                  query+= "AND ( cliente.nombre like '%' || :nombreParam || '%' "
                          + "OR cliente.apmaterno like '%' || :apeMatParam || '%'"
                          + "OR cliente.appaterno like '%' || :apePatParam || '%') ";
            if (includeFilters && documento != null)
                query+= "AND (cliente.tipoDocumento.idtipodoc = :idDocumentoParam) ";
//            if (includeFilters && numeroDoc > 0) 
//                query+= "AND (cliente.numdoc = :numDocParam)";

            query += "order by cliente.nombre asc";

            //Crear query
            Query q = session.createQuery(query);
            if(includeFilters &&  nombre != null && nombre.length()>0) {
                q.setParameter("nombreParam", nombre);
                q.setParameter("apeMatParam", nombre);
                q.setParameter("apePatParam", nombre);
            }
            if(includeFilters && documento != null)
                q.setParameter("idDocumentoParam", documento.getIdtipodoc());
//            if(includeFilters && numeroDoc > 0)
//                q.setParameter("numDocParam", numeroDoc);

            //Ejecutar query
            List lista = q.list();

            //Preparar resultado 
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                Cliente c = (Cliente) iter.next();
                Hibernate.initialize(c.getEstadoCliente());
                Hibernate.initialize(c.getCiudad());
                Hibernate.initialize(c.getTipoCliente());
                Hibernate.initialize(c.getTipoCorreo());
                Hibernate.initialize(c.getTipoDocumento());
                lstClientes.add(c);
            }
            tx.commit();
        } catch(Exception e) {
            if (tx != null) {
                tx.rollback();
                throw e;
           }
        } finally {
            session.close();
        }
        return lstClientes;
    }
    
    public ArrayList<TipoCliente> listarTipoCliente() {
        ArrayList<TipoCliente> lstTipoCliente = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();

            List lista = session.createQuery("from TipoCliente").list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                TipoCliente doc = (TipoCliente) iter.next();
                lstTipoCliente.add(doc);
            }
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
//                tx.rollback();
                throw e;
           }
        } finally {
            session.close();
        }
        return lstTipoCliente;
    }
    
      public ArrayList<TipoCorreo> listarTipoCorreo() {
        ArrayList<TipoCorreo> lstTipoCorreo = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null; 
        try { 
            tx = session.beginTransaction();

            List lista = session.createQuery("from TipoCorreo").list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                TipoCorreo c = (TipoCorreo) iter.next();
                lstTipoCorreo.add(c);
            }
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
//                tx.rollback();
                throw e;
           }
        } finally {
            session.close();
        }
        return lstTipoCorreo;
    }
      
    public ArrayList<TipoDocumento> listarTipoDocs() {
    
        ArrayList<TipoDocumento> lstTipoDocs = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try { 
            tx = session.beginTransaction();

            List lista = session.createQuery("from TipoDocumento").list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                TipoDocumento doc = (TipoDocumento) iter.next();
                lstTipoDocs.add(doc);
            }        
            tx.commit();
        } catch (Exception e){
            if (tx != null) {
//                tx.rollback();
                throw e;
            }
        } finally {
            session.close();
        }
        return lstTipoDocs;
    }
    
    public ArrayList<EstadoCliente> listarEstadosCliente() {
      ArrayList<EstadoCliente> lstEstadoCliente = new ArrayList<>();
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();

            List lista = session.createQuery("from EstadoCliente").list();
            for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
                EstadoCliente estado = (EstadoCliente) iter.next();
                lstEstadoCliente.add(estado);
            }
            tx.commit();
        } catch (Exception e){
            if (tx != null) {
//                tx.rollback();
                throw e;
            }
        } finally {
            session.close();
        }
        return lstEstadoCliente;
    }
}
